package com.liuwei.netty.packet;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

// 自定义的解码器
@Slf4j
public class MessageDecoder extends ByteToMessageDecoder {
    int length = 0;

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
          log.info("ByteBuf:" + in);
          // MessageProtocol第一部分是长度,占用4个字节,如果长于四个字节就说明可能有数据
          if (in.readableBytes() >= 4) {
              if (length == 0) {
                  length = in.readInt();
              }
              if (in.readableBytes() < length) {
                  // 说明数据还没有到齐
                  log.info("当前数据量不够,等待下一次");
                  return;
              }
              // 创建一个指定接收长度的字节数组
              byte[] content = new byte[length];
              // 将目标字节读入到content
              in.readBytes(content);
              // 还原MessageProtocol对象
              MessageProtocol protocol = new MessageProtocol();
              protocol.setLength(length);
              protocol.setContent(content);
              out.add(protocol);
              // 重置length = 0;
              length = 0;
          }
    }
}
